/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package view;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import model.Klant;
import model.Ticket;
import model.Verkoop;
import model.VerkoopPunt;
import model.Voorstelling;
import model.Zetel;
import persistence.KlantService;
import persistence.TicketService;
import persistence.VerkoopPuntService;
import persistence.VerkoopService;
import persistence.VoorstellingService;
import persistence.ZetelService;

/**
 *
 * @author Matthy & Jelle
 */
public class VerkoopPanel extends JPanel{

  /**
   * Labels.
   */
  private JLabel klantLabel;
  private JLabel voorstellingLabel;
  private JLabel zetelLabel;
  private JLabel verkoopPuntLabel;
  private JLabel voorstellingInfoLabel;

  /**
   * Input fields.
   */
  private JComboBox klantSelect;
  private JComboBox voorstellingSelect;
  private JList zetelList;
  private JComboBox verkoopPuntSelect;

  /**
   * Buttons.
   */
  private JButton submitButton;
  public VerkoopPanel() {
    super();
    initialiseerComponenten();
    layoutComponenten();
    initialiseerEventHandlers();
  }

  private void initialiseerComponenten() {
    // Klant
    this.klantLabel = new JLabel("Klant");
    this.klantSelect = new JComboBox(new KlantService().getKlanten().toArray());

    // Voorstelling
    this.voorstellingLabel = new JLabel("Voorstelling");
    this.voorstellingSelect = new JComboBox(new VoorstellingService().getVoorstellingen(new Date()).toArray());
    this.voorstellingInfoLabel = new JLabel("");

    // Zetels
    this.zetelLabel = new JLabel("Zetels*");
    this.zetelList = new JList();

    // Verkooppunt
    this.verkoopPuntLabel = new JLabel("Verkooppunt");
    this.verkoopPuntSelect = new JComboBox(new VerkoopPuntService().getVerkoopPunten().toArray());

    // Submit
    this.submitButton = new JButton("Registreer verkoop");
  }

  private void layoutComponenten() {
    this.setLayout(new GridLayout(6, 2));

    // Verkooppunt
    this.add(this.verkoopPuntLabel);
    this.add(this.verkoopPuntSelect);

    // Klant
    this.add(this.klantLabel);
    this.add(this.klantSelect);

    // Voorstelling
    this.add(this.voorstellingLabel);
    this.add(this.voorstellingSelect);
    this.add(new JLabel("Voorstelling Info"));
    this.add(this.voorstellingInfoLabel);

    // Zetels
    this.add(this.zetelLabel);
    JScrollPane scrollpane = new JScrollPane(this.zetelList);
    scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    scrollpane.setPreferredSize(new Dimension(scrollpane.getWidth(), 50));
    this.add(scrollpane);

    // Submit
    this.add(this.submitButton);
  }

  private void initialiseerEventHandlers() {
    this.voorstellingSelect.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        Voorstelling voorstelling = (Voorstelling)voorstellingSelect.getSelectedItem();
        zetelList.setListData(new ZetelService().getVrijeZetels(voorstelling).toArray());
        voorstellingInfoLabel.setText(voorstelling.getInfo());
      }
    });

    this.submitButton.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent ae) {
        Boolean error = false;
        if (voorstellingSelect.getSelectedIndex() == -1) {
          voorstellingLabel.setForeground(Color.RED);
          error = true;
        }
        else {
          voorstellingLabel.setForeground(Color.BLACK);
        }

        if (zetelList.getSelectedIndices().length == 0) {
          zetelLabel.setForeground(Color.RED);
          error = true;
        }
        else {
          zetelLabel.setForeground(Color.BLACK);
        }

        if (verkoopPuntSelect.getSelectedIndex() == -1) {
          verkoopPuntLabel.setForeground(Color.RED);
          error = true;
        }
        else {
          verkoopPuntLabel.setForeground(Color.BLACK);
        }

        if (!error) {
          Verkoop verkoop = new Verkoop();
          verkoop.setDatum(new Date());
          if (klantSelect.getSelectedIndex() == -1) {
            verkoop.setKlant(null);
          }
          else {
            verkoop.setKlant((Klant)klantSelect.getSelectedItem());
          }
          verkoop.setVerkooppunt((VerkoopPunt)verkoopPuntSelect.getSelectedItem());
          Object[] zetels = zetelList.getSelectedValues();
          Voorstelling voorstelling = (Voorstelling)voorstellingSelect.getSelectedItem();
          TicketService ts = new TicketService();
          List<Ticket> tickets = new ArrayList<Ticket>();
          for (Object o : zetels) {
            Zetel zetel = (Zetel)o;
            Ticket t = new Ticket();
            t.setZetel(zetel);
            t.setBarcode(ts.generateBarcode());
            t.setVoorstelling(voorstelling);
            t.setVerkoop(verkoop);
            Integer prijs = zetel.getZaalzone().getZone().getPrijs();
            if (voorstelling.getType().equals("3D")) {
              //prijs += voorstelling.getZaal().getComplex().getAdministratiesysteem().getToeslag3D();
            }
            t.setTotaalprijs(prijs);
            tickets.add(t);
            ts.save(t);
          }
          verkoop.setTickets(tickets);
          new VerkoopService().save(verkoop);
          reset();
        }
      }
    });
    this.voorstellingSelect.setSelectedIndex(0);
  }

  public void reset() {
    this.klantSelect.setSelectedIndex(0);
    this.verkoopPuntSelect.setSelectedIndex(0);
    this.voorstellingSelect.setSelectedIndex(0);
    this.zetelList.setSelectedIndex(-1);
  }

}
